/* 
 * DepartamentoBO.java
 * Copyright (c) Faculdade Anhanguera de Anápolis.
 * Tecnologia em Análise e Desenvolvimento de Sistemas.
 * Projeto Multidisciplinar de Autoaprendizagem.
 *
 * Este software é confidencial e propriedade da Faculdade Anhanguera de Anápolis.
 * Não é permitida sua distribuição ou divulgação do seu conteúdo sem expressa autorização da Faculdade Anhanguera de Anápolis.
 * Este arquivo contém informações proprietárias.
 */
package br.com.pma.chamatec.business.impl;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;
import javax.inject.Inject;

import br.com.pma.chamatec.business.IDepartamentoBO;
import br.com.pma.chamatec.dao.DepartamentoDAO;
import br.com.pma.chamatec.dao.UnidadeDepartamentoDAO;
import br.com.pma.chamatec.exception.ChamatecExceptionCode;
import br.com.pma.chamatec.exception.ChamatecNegocioException;
import br.com.pma.entity.Departamento;
import br.com.pma.entity.Unidade;
import br.com.pma.entity.UnidadeDepartamento;

/**
 * Classe de negócio da entidade Departamento.
 *
 * @author Ludemeula Fernandes de Sá
 */
@Stateless
public class DepartamentoBO implements IDepartamentoBO {
	@Inject
	private DepartamentoDAO departamentoDAO;

	@Inject
	private UnidadeDepartamentoDAO unidadeDepartamentoDAO;

	/**
	 * @see br.com.pma.chamatec.business.IDepartamentoBO#salvar(br.com.pma.entity.Departamento)
	 */
	@Override
	public Departamento salvar(Departamento departamento) throws ChamatecNegocioException {
		validaCamposObrigatorios(departamento);

		Departamento departamentoEncontrado = departamentoDAO.recuperarPorNome(departamento);
		if (departamentoEncontrado != null && departamentoEncontrado.getId() != null && departamento.getId() != departamentoEncontrado.getId()) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_006);
		}
		departamento = departamentoDAO.merge(departamento);

		return departamento;
	}

	/**
	 * @see br.com.pma.chamatec.business.IDepartamentoBO#remover(br.com.pma.entity.Departamento)
	 */
	@Override
	public void remover(Departamento departamento) throws ChamatecNegocioException {
		validaReferencias(departamento);
		departamentoDAO.remove(departamento);
	}

	/**
	 * @see br.com.pma.chamatec.business.IDepartamentoBO#getListDescricao()
	 */
	@Override
	public List<Departamento> getListDescricao() throws ChamatecNegocioException {
		return departamentoDAO.getListDescricao();
	}

	/**
	 * @see br.com.pma.chamatec.business.IDepartamentoBO#pesquisar(br.com.pma.entity.Departamento)
	 */
	@Override
	public List<Departamento> pesquisar(Departamento departamento) throws ChamatecNegocioException {
		List<Departamento> resultado = departamentoDAO.pesquisar(departamento);
		if (resultado == null || resultado.size() == 0) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_001);
		}
		return resultado;
	}


	/**
	 * @see br.com.pma.chamatec.business.IDepartamentoBO#pesquisarUnidadePorDepartamento(br.com.pma.entity.Unidade)
	 */
	@Override
	public List<Departamento> pesquisarUnidadePorDepartamento(Unidade unidade) throws ChamatecNegocioException {
		List<UnidadeDepartamento> unidadesDepartamentos = unidadeDepartamentoDAO.pesquisarPorUnidade(unidade);
		List<Departamento> resultado = new ArrayList<Departamento>();
		for (UnidadeDepartamento unidadeDepartamento : unidadesDepartamentos) {
			resultado.add(unidadeDepartamento.getDepartamento());
		}

		return resultado;
	}

	/**
	 * Realiza a validação dos campos obrigatórios.
	 * 
	 * @param departamento
	 * @throws ChamatecNegocioException
	 */
	private void validaCamposObrigatorios(Departamento departamento) throws ChamatecNegocioException {
		if (departamento.getNome() == null || departamento.getNome().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}

		if (departamento.getDescricao() == null || departamento.getDescricao().equals("")) {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_002);
		}
	}

	/**
	 * Valida as referências de UnidadeDepartamento não deixando excluir um departamento quando existir estas referências.
	 * 
	 * @param departamento
	 * @throws ChamatecNegocioException
	 */
	private void validaReferencias(Departamento departamento) throws ChamatecNegocioException {
		List<UnidadeDepartamento> resultado = unidadeDepartamentoDAO.pesquisarPorDepartamento(departamento);
		if (resultado != null && resultado.size() > 0)  {
			throw new ChamatecNegocioException(ChamatecExceptionCode.ME_012);
		}
	}
}